﻿using System;
using System.Collections.Generic;
using Labthink.PCSoft.UniversalHost4.Model;
using Labthink.PCSoft.UniversalHost4.Utility;

namespace Labthink.PCSoft.UniversalHost4
{
    /// <summary>
    /// 串口协议字典
    /// </summary>
    public static class DcProtocol
    {
        /// <summary>
        /// 参数
        /// </summary>
        public static Dictionary<int, ComAnalysis> DicParam = new Dictionary<int, ComAnalysis>();
        public static Dictionary<int, ComAnalysis> DicRealTimeData = new Dictionary<int, ComAnalysis>();
        public static Dictionary<int, ComAnalysis> DicResult = new Dictionary<int, ComAnalysis>();

        //组装协议用于解析串口数据，以数据地址为索引，数据地址见通讯协议；
        static DcProtocol()
        {
            /*参数
            命令（第2字节） 
            0x01 - 设备参数上传：
            上控温：  2Bytes  单位：℃ 1位小数
            下控温：  2Bytes  单位：℃  1位小数
            设定压力：4Bytes 小数位数根据单位判断 "kPa","mbar","psi","mmHg"对应0,0,1,0位小数
            试验时间：4Bytes 单位：秒 2位小数
            样品信息：8Bytes 最长8字节，不足8字节用' '填充
            件数：    2Bytes 16位无符号整数
            压力单位：1Byte 0x00-kPa 0x01-mbar 0x02-psi 0x03-mmHg
            */
            DicParam.Add(1010, new ComAnalysis(new List<int> { 1, 2 }, 1)); // 上控温
            DicParam.Add(1020, new ComAnalysis(new List<int> { 3, 4 }, 1)); // 下控温
            DicParam.Add(1030, new ComAnalysis(new List<int> { 5, 6, 7, 8 }, 0)); //热封压力，位数根据单位判断
            DicParam.Add(1040, new ComAnalysis(new List<int> { 9, 10, 11, 12 }, 2)); //热封时间
            DicParam.Add(1050, new ComAnalysis(new List<int> { 13, 14, 15, 16, 17, 18, 19, 20 }, 0));//样品信息
            DicParam.Add(1060, new ComAnalysis(new List<int> { 21, 22 }, 0)); // 件数
            //DicParam.Add(0, new ComAnalysis(new List<int> { 23 }, 0));//压力单位

            /* 实时数据
            命令（第2字节）
            0x04 - 实时数据传输：
            上控温：  2Bytes  单位：℃ 1位小数
            下控温：  2Bytes  单位：℃  1位小数
            压力：    4Bytes 小数位数根据单位判断 "kPa","mbar","psi","mmHg"对应0,0,1,0位小数
            时间：    4Bytes 单位：秒 2位小数
            压力单位：1Byte 0x00-kPa 0x01-mbar 0x02-psi 0x03-mmHg  *注意：此处单位是方便实时数据传输，实际上单位已经由设备参数上传
                */
            DicRealTimeData.Add(2010, new ComAnalysis(new List<int> { 1, 2 }, 1)); // 上封头温度
            DicRealTimeData.Add(2020, new ComAnalysis(new List<int> { 3, 4 }, 1)); // 下封头温度
            DicRealTimeData.Add(2030, new ComAnalysis(new List<int> { 5, 6, 7, 8 }, 0)); //热封压力，位数根据单位判断
            DicRealTimeData.Add(2040, new ComAnalysis(new List<int> { 9, 10, 11, 12 }, 2)); //热封时间

            /* 结果
            0x03 - 试验结束：
            编号：2Bytes 16位无符号整数
            当前次数：2Bytes 16位无符号整数
            结果：1Byte 0x00-不合格 0x01-合格 0x02-手动停止（不保存结果）
            */
            DicResult.Add(10034, new ComAnalysis(new List<int> { 1, 2 }, 0)); // 试验编号
            DicResult.Add(3001, new ComAnalysis(new List<int> { 3, 4 }, 0)); // 次数
            DicResult.Add(3010, new ComAnalysis(new List<int> { 5 }, 0)); // 是否合格
        }

        /// <summary>
        /// 将参数转换为byte 数组
        /// </summary>
        /// <param name="ps"></param>
        /// <returns></returns>
        public static List<byte> ConvertParamsToBytes(List<Param> ps)
        {
            List<byte> r = new List<byte>();

            foreach (var dp in DicParam)
            {
                var cp = ps.Get(dp.Key).Value;
                var v1 = cp.ToDouble();
                if (dp.Key == 1040) // 临界值，百分数转为小数
                {
                    v1 /= 100.0;
                }

                for (int i = 0; i < dp.Value.DecimalPlace; i++)
                {
                    v1 *= 10;
                }

                var value = (int)v1;
                dp.Value.Bytes = value.ToBytes(dp.Value.Address.Count);
                r.AddRange(dp.Value.Bytes);
            }

            return r;
        }
    }
}
